package com.conph.moring.core;

import java.lang.reflect.Method;

public interface IIntercepterChain {
	/**
	 * 在链后追加拦截器节点
	 * @param imd
	 */
	void add(IntercepterMethodDefination imd);

	/**
	 * 在拦截目标操作执行前调用，其将从拦截器工厂中，
	 * 根据参数表达出的拦截目标方法构建出其IntercepterTargetMethod对象，
	 * 再从拦截器工厂中取出首节点进行链遍历拦截，若遇到返回值为false的拦截结果，
	 * 则直接返回false。
	 * @param klass 代理对象拦截到的目标类
	 * @param method 目标方法
	 * @param args 目标参数
	 * @return 拦截结果，true表示拦截不成功，反之拦截成功，目标操作将不被执行。
	 */
	boolean doBefore(Class<?> klass, Method method, Object[] args);
	/**
	 * 接管操作执行后的返回值对象，从第一个后置拦截器节点开始针对返回值执行相关操作，链遍历完后，后置拦截结束。
	 * @param klass 代理对象拦截到的目标类
	 * @param method 目标方法
	 * @param args 目标参数
	 * @return 拦截结果。
	 */
	Object doAfter(Class<?> klass, Method method, Object args);
	/**
	 * 接管操作执行后的返回值对象，从第一个后置拦截器节点开始针对返回值执行相关操作，链遍历完后，后置拦截结束。
	 * @param klass 代理对象拦截到的目标类
	 * @param method 目标方法
	 * @param E 目标方法执行时发生的异常
	 * @return 无返回值。
	 */
	void doException(Class<?> klass, Method method, Throwable E);
}
